public class StringExtractor {

    public static void main(String[] args) {
        String sourceText = "\"一般学习一门编程语言的时候，基本上第一个程序是输出\\\"Hello World!\\\"\"";
        StringBuilder currentString = null;
        State state = State.NORMAL;
        boolean escaping = false;

        for (char c : sourceText.toCharArray()) {
            if (!escaping) {
                if (c == '"') {
                    if (state == State.NORMAL) {
                        state = State.IN_STRING;
                        currentString = new StringBuilder(); // 开始新的字符串
                    } else if (state == State.IN_STRING && currentString != null) {
                        state = State.NORMAL;
                        // 打印完整的字符串（包括双引号）
                        System.out.println(currentString.append(c).toString());
                        currentString = null; // 重置StringBuilder，为下一个字符串做准备
                    }
                } else if (c == '\\' && state == State.IN_STRING) {
                    escaping = true; // 设置逃逸标志
                } else if (state == State.IN_STRING) {
                    currentString.append(c);
                }
            } else {
                // 处理转义字符后的字符
                if (state == State.IN_STRING && currentString != null) {
                    currentString.append(c);
                }
                escaping = false; // 重置逃逸标志
            }
        }

        // 注意：在这个特定的例子中，我们不需要处理循环之后的额外逻辑，
        // 因为输入字符串是完整的，并且以双引号结束。
    }

    private enum State {
        NORMAL, IN_STRING
    }
}